#pragma once

#include "HttpBase.hpp"
#include <sstream>

namespace network {

    class HttpReply : public HttpBase {

    public:

        /**
          * @brief  构造一个空的Http回复，默认状态码为200，状态为OK
          */
        HttpReply() : status_code_("200"), status_("OK") {}

        /**
          * @brief  根据指定的状态码构造一个空的Http回复，状态默认为OK
          * @param  status_code 状态码
          */
        explicit HttpReply(const std::string &status_code) : status_code_(status_code), status_("OK") {}

        /**
          * @brief  根据指定的状态码和响应体构造一个Http回复
          * @param  status_code 状态码
          * @param  body        响应体
          */
        HttpReply(const std::string &status_code, const std::string &body) : HttpReply(status_code) { setBody(body); }

        /**
          * @brief  设置Http响应状态码
          * @param  status_code 状态码
          */
        void setStatusCode(const std::string &status_code) { status_code_ = status_code; }

        /**
          * @brief  获取Http响应状态码
          * @retval 状态码
          */
        std::string getStatusCode() const { return status_code_; }

        /**
          * @brief  设置Http响应状态
          * @param  status 响应状态
          */
        void setStatus(const std::string &status) { status_ = status; }

        /**
          * @brief  获取Http响应状态
          * @retval 响应状态
          */
        std::string getStatus() const { return status_; }

        /**
          * @brief  将Http请求类转化为字符串
          * @retval 一个字符串
          */
        std::string toString() const override;

    private:

        // 状态码
        std::string status_code_;

        // 状态
        std::string status_;

    };

    std::string HttpReply::toString() const {
        std::ostringstream stream;
        stream << version_ << ' ' << status_code_ << ' ' << status_ << "\r\n";
        for (const auto &it: header_) {
            stream << it.first << ": " << it.second << "\r\n";
        }
        stream << "\r\n" << body_;
        return stream.str();
    }

}
